package LeetCode;

/**
 * 存在一个按升序排列的链表，给你这个链表的头节点 head
 * 请你删除链表中所有存在数字重复情况的节点，只保留原始链表中没有重复出现的数字。
 * 返回同样按升序排列的结果链表。
 * 【删除链表中所有重复元素】
 */
public class Num82 {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummyHead=new ListNode(-101);
        dummyHead.next=head;
        ListNode prev=dummyHead;
        ListNode cur=dummyHead.next;
        while(cur!=null){
            ListNode last=cur.next;
            if(last==null){//链表只有一个元素
                return dummyHead.next;
            }else{//链表至少有两个元素
                if (cur.val== last.val){
                    //cur与last值相等，last不断后移直到不相等
                    while(last!=null&&last.val==cur.val){
                        last=last.next;
                    }
                    //cur last值不相等
                    //此时prev是重复节点的前驱，cur是重复节点，last是重复节点的后继，直接prev.next->last跳过重复节点
                    prev.next=last;
                    //但是prev不更新，cur更新到last位置,last更新到更新后cur的下一位继续判断后面的数字是否是多个重复数字
                    cur=last;
                }else{
                    //cur与last值不相等，三者同时后移
                    prev=prev.next;
                    cur=cur.next;
                }
            }
        }
        return dummyHead.next;
    }
}
